package org.dromara.system.utils;

import lombok.experimental.UtilityClass;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.DecimalFormat;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

@UtilityClass
public class CalculatorUtils {
    private static final String SCIENTIFIC_NOTATION_REGEX = "^[+-]?\\d+(\\.\\d+)?[eE][+-]?\\d+$";
    public double calculateActualValue(Long identifier, Long multiple, double originalValue) {

        if (identifier == 1) {
            // 缩小
            return originalValue / multiple;
        } else if (identifier == 2) {
            // 放大
            return originalValue * multiple;
        } else {
            return originalValue;
        }
    }

    public static List<Long> convertToLongList(String str) {
        if (str == null) {
            return Collections.emptyList(); // 如果 str 为 null，返回一个空的 List
        }

        // 按逗号分割字符串
        String[] strArray = str.split(",");

        // 创建 List<Long>
        List<Long> longList = new ArrayList<>();

        // 转换字符串数组为 Long 并添加到列表中
        for (String s : strArray) {
            longList.add(Long.parseLong(s.trim()));
        }

        return longList;
    }

    public static String extractStatus(String input) {
        // 找到"状态"前后的索引
        int startIndex = input.indexOf("状态") - 1;
        int endIndex = input.indexOf("状态") + 2;

        // 检查索引是否有效
        if (startIndex >= 0 && endIndex <= input.length()) {
            return input.substring(startIndex, endIndex);
        } else {
            return "无效的输入";
        }
    }

    public static BigDecimal processScientificNotation(BigDecimal bigDecimal) {
        if (bigDecimal == null) {
            return BigDecimal.ZERO;
        }
        try {
            return bigDecimal.setScale(2, RoundingMode.HALF_UP);
        } catch (NumberFormatException e) {
            throw new IllegalArgumentException("Invalid number format: " + bigDecimal);
        }

        // 判断是否符合科学计数法格式
//        if (input.matches(SCIENTIFIC_NOTATION_REGEX)) {
//            try {
//                // 将科学计数法字符串转换为 BigDecimal
//                BigDecimal bigDecimal = new BigDecimal(input);
//                DecimalFormat decimalFormat = new DecimalFormat("#.###");
//                String formattedValue = decimalFormat.format(bigDecimal);
//                return new BigDecimal(formattedValue);
//            } catch (NumberFormatException e) {
//                throw new IllegalArgumentException("Invalid scientific notation: " + input);
//            }
//        } else {
//            // 如果不是科学计数法，直接返回原值
//            try {
//                BigDecimal bigDecimal = new BigDecimal(input);
//                return bigDecimal.setScale(3, RoundingMode.HALF_UP);
//            } catch (NumberFormatException e) {
//                throw new IllegalArgumentException("Invalid number format: " + input);
//            }
//        }
    }

    public static String convertUtcToChinaTimeWithFormat(String utcTime) {
        // 根据输入字符串的长度动态调整格式
        String formatString;
        if (utcTime.length() == 22) { // yyyy-MM-dd HH:mm:ss.SS
            formatString = "yyyy-MM-dd HH:mm:ss.SS";
        } else if (utcTime.length() == 23) { // yyyy-MM-dd HH:mm:ss.SSS
            formatString = "yyyy-MM-dd HH:mm:ss.SSS";
        } else {
            throw new IllegalArgumentException("Invalid date format: " + utcTime);
        }

        DateTimeFormatter formatter = DateTimeFormatter.ofPattern(formatString);

        // 将 UTC 时间字符串解析为 LocalDateTime
        LocalDateTime utcDateTime = LocalDateTime.parse(utcTime, formatter);

        // 将 UTC 时间转换为中国时区时间
        ZonedDateTime chinaTime = utcDateTime.atZone(ZoneId.of("UTC"))
            .withZoneSameInstant(ZoneId.of("Asia/Shanghai"));

        // 使用统一的输出格式 yyyy-MM-dd HH:mm:ss.SSS
        DateTimeFormatter outputFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS");
        return chinaTime.format(outputFormatter);
    }

}
